home *** CD-ROM | disk | FTP | other *** search
/ Programming Languages Suite / ProgramD2.iso / Borland / Borland C++ V5.02 / CLOBSH.PAK / OBJECT.H < prev    next >
C/C++ Source or Header  |  1997-05-06  |  5KB  |  210 lines

  1. /*------------------------------------------------------------------------*/
  2. /*                                                                        */
  3. /*  OBJECT.H                                                              */
  4. /*                                                                        */
  5. /*  Copyright Borland International 1991, 1993                            */
  6. /*  All Rights Reserved                                                   */
  7. /*                                                                        */
  8. /*------------------------------------------------------------------------*/
  9.  
  10. #if !defined( __OBJECT_H )
  11. #define __OBJECT_H
  12.  
  13. #define BI_OLDNAMES
  14.  
  15. #if !defined( __STDDEF_H )
  16. #include <StdDef.h>
  17. #endif  // __STDDEF_H
  18.  
  19. #if !defined( __IOSTREAM_H )
  20. #include <iostream.h>
  21. #endif  // __IOSTREAM_H
  22.  
  23. #if !defined( __CLASSLIB_SHDDEL_H )
  24. #include "classlib\shddel.h"
  25. #endif  // __CLASSLIB_SHDDEL_H
  26.  
  27. #if !defined( __CLSTYPES_H )
  28. #include "classlib\obsolete\ClsTypes.h"
  29. #endif  // __CLSTYPES_H
  30.  
  31. #if !defined( __CLSDEFS_H )
  32. #include "classlib\obsolete\ClsDefs.h"
  33. #endif  // __CLSDEFS_H
  34.  
  35. #pragma option -Vo-
  36. #if defined( __BCOPT__ ) && !defined( __FLAT__ ) && !defined( _ALLOW_po )
  37. #pragma option -po-
  38. #endif
  39.  
  40. _CLASSDEF(Object)
  41. _CLASSDEF(Error)
  42.  
  43. typedef TShouldDelete ShdDel;
  44.  
  45. class _CLASSTYPE Object
  46. {
  47.  
  48. public:
  49.  
  50.     virtual ~Object()
  51.         {
  52.         }
  53.  
  54.     virtual classType isA() const = 0;
  55.     virtual _TCHAR _FAR *nameOf() const = 0;
  56.     virtual hashValueType hashValue() const = 0;
  57.     virtual int isEqual( const Object _FAR & ) const = 0;
  58.  
  59.     virtual int isSortable() const
  60.         {
  61.         return 0;
  62.         }
  63.  
  64.     virtual int isAssociation() const
  65.         {
  66.         return 0;
  67.         }
  68.  
  69.     virtual void forEach( iterFuncType, void _FAR * );
  70.     virtual Object _FAR & firstThat( condFuncType, void _FAR * ) const;
  71.     virtual Object _FAR & lastThat( condFuncType, void _FAR * ) const;
  72.     virtual void printOn( ostream _FAR & ) const = 0;
  73.  
  74.     static Object _FAR *ZERO;
  75.  
  76.     static Object _FAR & ptrToRef( Object _FAR *p )
  77.         { return p == 0 ? *ZERO : *p; }
  78.  
  79.     static const Object _FAR & ptrToRef( const Object _FAR *p )
  80.         { return p == 0 ? *ZERO : *p; }
  81.  
  82.     friend ostream _FAR& operator << ( ostream _FAR&, const Object _FAR& );
  83.  
  84.     class _EXPCLASS TShouldDelete
  85.     {
  86.  
  87.     friend Object;
  88.  
  89.     public:
  90.  
  91.         enum DeleteType { NoDelete, DefDelete, Delete };
  92.  
  93.         TShouldDelete( DeleteType dt = Delete ) :
  94.             ShouldDelete((ShdDel::DeleteType)dt)
  95.             {
  96.             }
  97.  
  98.         int ownsElements()
  99.             {
  100.             return ShouldDelete.OwnsElements();
  101.             }
  102.  
  103.         void ownsElements( int del )
  104.             {
  105.             ShouldDelete.OwnsElements(del);
  106.             }
  107.  
  108.     protected:
  109.  
  110.         int delObj( DeleteType dt )
  111.             {
  112.             return ShouldDelete.DelObj((ShdDel::DeleteType)dt);
  113.             }
  114.  
  115.     private:
  116.  
  117.         ShdDel ShouldDelete;
  118.  
  119.     };
  120.  
  121. };
  122.  
  123. #define NOOBJECT  (*(Object::ZERO))
  124.  
  125. inline void Object::forEach( iterFuncType func, void _FAR *args )
  126. {
  127.     ( *func )( *this, args );
  128. }
  129.  
  130. inline Object _FAR & Object::firstThat( condFuncType func,
  131.                                         void _FAR *args
  132.                                       ) const
  133. {
  134.    return (*func)( *this, args ) == 0 ? NOOBJECT : (Object&)*this;
  135. }
  136.  
  137. inline Object _FAR & Object::lastThat( condFuncType func,
  138.                                        void _FAR *args
  139.                                      ) const
  140. {
  141.     return Object::firstThat( func, args );
  142. }
  143.  
  144. inline ostream _FAR& operator << ( ostream _FAR& out, const Object _FAR& obj )
  145. {
  146.     obj.printOn( out );
  147.     return out;
  148. }
  149.  
  150. inline int operator == ( const Object _FAR& test1, const Object _FAR& test2 )
  151. {
  152.     return (test1.isA() == test2.isA()) && test1.isEqual( test2 );
  153. }
  154.  
  155. inline int operator !=( const Object _FAR& test1, const Object _FAR& test2 )
  156. {
  157.     return !( test1 == test2 );
  158. }
  159.  
  160.  
  161. class _CLASSTYPE Error : public Object
  162. {
  163.  
  164. public:
  165.  
  166.     virtual classType isA() const
  167.         {
  168.         return errorClass;
  169.         }
  170.  
  171.     virtual _TCHAR _FAR *nameOf() const
  172.         {
  173.         return "Error";
  174.         }
  175.  
  176.     virtual hashValueType hashValue() const
  177.         {
  178.         return ERROR_CLASS_HASH_VALUE;
  179.         }
  180.  
  181.     virtual int isEqual( const Object _FAR & ) const
  182.         {
  183.         return 1;
  184.         }
  185.  
  186.     virtual void printOn( ostream _FAR & ) const;
  187.  
  188.     void operator delete( void _FAR * );
  189.  
  190. };
  191.  
  192.  
  193. inline void Error::printOn( ostream _FAR & out ) const
  194. {
  195.     out << nameOf() << '\n';
  196. }
  197.  
  198. inline void Error::operator delete( void _FAR * )
  199. {
  200.     ClassLib_error( __EDELERROR );
  201. }
  202.  
  203. #if defined( __BCOPT__ ) && !defined( __FLAT__ ) && !defined( _ALLOW_po )
  204. #pragma option -po.
  205. #endif
  206. #pragma option -Vo.
  207.  
  208. #endif
  209.  
  210.